#include "video.h"
#include "game.h"

Game* game = NULL;

/*---------------------------------

Game::Game( void )
overloadad
Konstruktor när ett helt nytt spel skapas.

---------------------------------*/

Game::Game( void ) : markerad( NULL ), runda( 1 ), vemsDrag( 0 ) {
	delete game, game = this; //Denna måste vara med..

	for( int i = 0; i < 8; i++ ) {
		for( int j = 0; j < 8; j++ ) {
			pjasArray[i][j] = NULL;
		}
	}
	gamelog.open( "gamelog.txt" );
	gamelog << "detta är en gamelog\n";
	gamelog.flush();

	spelare[VIT] = new Spelare( VIT );
	spelare[SVART] = new Spelare( SVART );
}

/*---------------------------------

Game::Game( std::ofstream sparadFil )
overloadad
Konstruktor när ett spel laddas.
Argument: sparadFil = filen från vilken speldatat inläses.

---------------------------------*/

Game::Game( std::ofstream sparadFil ) : markerad( NULL ), runda( 1 ), vemsDrag( 0 ) {
	delete game, game = this;

}

/*---------------------------------

Game::~Game( void )
Destruktor.

---------------------------------*/

Game::~Game( void ) {
	delete spelare[VIT];
	delete spelare[SVART];
	gamelog.close();
}

/*---------------------------------

Game::markeraPjas( short x, short y )
Markerar en pjäs som klickats och ritar om markerad + möjliga drag-rutor.
Anropas från musKlick
Argument: x = x-position för musen, y = y-position för musen

---------------------------------*/

void Game::markeraPjas( short x, short y ) {

	// Markera pjäsen + rutan
	markerad = pjasArray[x][y];
	markerad->rita( false, true );

	// Om en pjäs kan gå till en viss ruta, markera med färg och rita om ev. pjäs där
	// Vore nice om denna på något sätt kunde använda pjäsens mojligaDrag-array
	for( int i = 0; i < 8; i++ ) {
		for( int j = 0; j < 8; j++ ) {
			if( markerad->mojligtDrag( i, j ) ) {
				video->ritaRektangel( i*60, j*60, 60, 60, GRA_FARG );
				if( pjasArray[i][j] != NULL ) {
					pjasArray[i][j]->rita( true );
				}
			}
		}
	}
}

/*---------------------------------

Game::avmarkeraPjas( void )
Avmarkerar en pjäs som markerats och ritar om den + tar bort möjliga drag-rutor.
Anropas från musKlick
Argument: x = x-position för musen, y = y-position för musen

---------------------------------*/

void Game::avmarkeraPjas( void ) {
	// Rita om alla rutor och ev pjäser som varit möjliga drag
	for( int i = 0; i < 8; i++ ) {
		for( int j = 0; j < 8; j++ ) {
			if( markerad->mojligtDrag( i, j ) ) {
				video->ritaRektangel( i*60, j*60, 60, 60, RUT_FARG(i, j) );
				if( pjasArray[i][j] != NULL ) {
					pjasArray[i][j]->rita();
				}
			}
		}
	}
	// Rita om pjäsen i fråga
	markerad->rita();
}

/*---------------------------------

Game::musKlick( short xpos, short ypos )
Funktion när musen klickas
Argument: xpos = x-position för musen, ypos = y-position för musen

---------------------------------*/

void Game::musKlick( short xpos, short ypos ) {
	short x = xpos / 60;
	short y = ypos / 60;
	if ( x < 8 && y < 8 ) {
		if( markerad == NULL && pjasArray[x][y] != NULL && pjasArray[x][y]->spelare == vemsDrag ) {
			//Markera pjäs
			markeraPjas( x, y );
		}
		else if ( markerad != NULL && pjasArray[x][y] == markerad ) {
			//Avmarkera pjäs
			avmarkeraPjas();
			markerad = NULL;
		}
		else if ( markerad && pjasArray[x][y] == NULL && markerad->mojligtDrag( x, y ) ) {
			//Gå till en tom ruta
			avmarkeraPjas();

			flytta_pjas:
			registreraDrag( markerad->xpos, markerad->ypos, x, y, markerad->typ );

			video->ritaRektangel( markerad->xpos*60, markerad->ypos*60, 60, 60, RUT_FARG(markerad->xpos, markerad->ypos) );

			pjasArray[markerad->xpos][markerad->ypos] = NULL;
			pjasArray[x][y] = markerad;
			markerad->xpos = x;
			markerad->ypos = y;

			markerad->rita();
			markerad = NULL;
		}
		else if ( markerad != NULL && pjasArray[x][y] != NULL ) {
			//Har redan en markerad och trycker på en annan pjäs
			if ( vemsDrag != pjasArray[x][y]->spelare ) {
				//Ta pjäs
				if( markerad->mojligtDrag( x, y ) ) {
					avmarkeraPjas();
					spelare[!vemsDrag]->taPjas( pjasArray[x][y] );
					goto flytta_pjas; //18 rader upp
				}
			}
			else {
				//Byt markerad
				avmarkeraPjas();
				markeraPjas( x, y );
			}

		}
	}

	video->flip();
}

/*--------------------------------

void Game::registreraDrag( char x1, char y1, char x2, char y2, char typ )
Registrerar ett drag, skriver ut det och lägger det till drag-vektorn
Argument: x1-y2 = koordinaterna, typ = pjäsens typ

--------------------------------*/

void Game::registreraDrag( char x1, char y1, char x2, char y2, char typ ) {

	SDL_Color vit = {255,255,255};
	char text[6];
	text[0] = x1 + 'A';
	text[1] = y1 + '1';
	text[2] = '-';
	text[3] = x2 + 'A';
	text[4] = y2 + '1';
	text[5] = '\0';
	video->renderText( text, 482, (runda-1)*28, vit );

	Game::Drag nytt_drag = { vemsDrag, {x1, y1}, {x2, y2}, typ };
	drag.push_back( nytt_drag );

	gamelog << text << "\n";
	gamelog.flush();

	vemsDrag = !vemsDrag;
	runda++;
}
